/*!
 * \file DataDefine.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief WonderTrader数据存储定义文件
 * 
 * \details 该文件定义了WonderTrader数据存储系统中使用的核心数据结构：
 *          - 数据块类型枚举和版本定义
 *          - 数据块头部结构体定义
 *          - 实时数据块结构体定义
 *          - 历史数据块结构体定义
 *          - K线、Tick、成交、委托等各种数据格式
 *          - 数据压缩和版本兼容性支持
 *          这些定义为WonderTrader的高效数据存储和访问提供了基础架构
 */
#pragma once
#include "../Includes/WTSStruct.h"

USING_NS_WTP;

#pragma pack(push, 1)

const char BLK_FLAG[] = "&^%$#@!\0"; ///< 数据块标识符

const int FLAG_SIZE = 8; ///< 标识符大小

/*!
 * \enum BlockType
 * \brief 数据块类型枚举
 * 
 * \details 定义了WonderTrader数据存储系统中所有支持的数据块类型：
 *          - 实时数据块：用于存储当前交易日的实时数据
 *          - 历史数据块：用于存储历史交易数据
 *          - 不同周期的K线数据：1分钟、5分钟、日线等
 *          - Level2数据：Tick、成交明细、委托明细、委托队列
 */
typedef enum tagBlockType
{
	BT_RT_Minute1		= 1,	///< 实时1分钟K线数据
	BT_RT_Minute5		= 2,	///< 实时5分钟K线数据
	BT_RT_Ticks			= 3,	///< 实时Tick行情数据
	BT_RT_Cache			= 4,	///< 实时数据缓存
	BT_RT_Trnsctn		= 5,	///< 实时逐笔成交数据
	BT_RT_OrdDetail		= 6,	///< 实时逐笔委托数据
	BT_RT_OrdQueue		= 7,	///< 实时委托队列数据

	BT_HIS_Minute1		= 21,	///< 历史1分钟K线数据
	BT_HIS_Minute5		= 22,	///< 历史5分钟K线数据
	BT_HIS_Day			= 23,	///< 历史日线数据
	BT_HIS_Ticks		= 24,	///< 历史Tick行情数据
	BT_HIS_Trnsctn		= 25,	///< 历史逐笔成交数据
	BT_HIS_OrdDetail	= 26,	///< 历史逐笔委托数据
	BT_HIS_OrdQueue		= 27	///< 历史委托队列数据
} BlockType;

#define BLOCK_VERSION_RAW		0x01	///< 旧结构体未压缩版本
#define BLOCK_VERSION_CMP		0x02	///< 旧结构体压缩版本
#define BLOCK_VERSION_RAW_V2	0x03	///< 新结构体未压缩版本
#define BLOCK_VERSION_CMP_V2	0x04	///< 新结构体压缩版本

/*!
 * \struct BlockHeader
 * \brief 数据块头部结构体
 * 
 * \details 定义了数据块的基础头部信息，包含：
 *          - 数据块标识符：用于验证数据块的有效性
 *          - 数据块类型：标识数据块存储的数据类型
 *          - 版本信息：用于数据格式兼容性处理
 *          提供了版本检查和压缩状态检查的内联方法
 */
typedef struct _BlockHeader
{
	char		_blk_flag[FLAG_SIZE];	///< 数据块标识符
	uint16_t	_type;					///< 数据块类型
	uint16_t	_version;				///< 数据块版本

	/*!
	 * \brief 检查是否为旧版本
	 * \return 如果是旧版本返回true，否则返回false
	 */
	inline bool is_old_version() const {
		return (_version == BLOCK_VERSION_CMP || _version == BLOCK_VERSION_RAW);
	}

	/*!
	 * \brief 检查是否为压缩版本
	 * \return 如果是压缩版本返回true，否则返回false
	 */
	inline bool is_compressed() const {
		return (_version == BLOCK_VERSION_CMP || _version == BLOCK_VERSION_CMP_V2);
	}
} BlockHeader;

/*!
 * \struct BlockHeaderV2
 * \brief 数据块头部结构体V2版本
 * 
 * \details 扩展了基础头部信息，增加了数据大小字段：
 *          - 继承了BlockHeader的所有字段
 *          - 增加了压缩后数据大小信息
 *          - 支持更大的数据块和更精确的大小控制
 */
typedef struct _BlockHeaderV2
{
	char		_blk_flag[FLAG_SIZE];	///< 数据块标识符
	uint16_t	_type;					///< 数据块类型
	uint16_t	_version;				///< 数据块版本

	uint64_t	_size;					///< 压缩后数据大小

	/*!
	 * \brief 检查是否为旧版本
	 * \return 如果是旧版本返回true，否则返回false
	 */
	inline bool is_old_version() const {
		return (_version == BLOCK_VERSION_CMP || _version == BLOCK_VERSION_RAW);
	}

	/*!
	 * \brief 检查是否为压缩版本
	 * \return 如果是压缩版本返回true，否则返回false
	 */
	inline bool is_compressed() const {
		return (_version == BLOCK_VERSION_CMP || _version == BLOCK_VERSION_CMP_V2);
	}
} BlockHeaderV2;

#define BLOCK_HEADER_SIZE	sizeof(BlockHeader)		///< 基础头部大小
#define BLOCK_HEADERV2_SIZE sizeof(BlockHeaderV2)	///< V2头部大小

/*!
 * \struct RTBlockHeader
 * \brief 实时数据块头部结构体
 * 
 * \details 实时数据块的头部信息，扩展了基础头部：
 *          - 继承BlockHeader的所有字段
 *          - 增加了数据大小和容量信息
 *          - 用于管理实时数据的动态增长
 */
typedef struct _RTBlockHeader : BlockHeader
{
	uint32_t _size;			///< 当前数据大小
	uint32_t _capacity;		///< 数据容量
} RTBlockHeader;

/*!
 * \struct RTDayBlockHeader
 * \brief 每日实时数据块头部结构体
 * 
 * \details 带有日期信息的实时数据块头部：
 *          - 继承RTBlockHeader的所有字段
 *          - 增加了交易日期信息
 *          - 用于按交易日组织实时数据
 */
typedef struct _RTDayBlockHeader : RTBlockHeader
{
	uint32_t		_date;		///< 交易日期（YYYYMMDD格式）
} RTDayBlockHeader;

/*!
 * \struct RTKlineBlock
 * \brief 实时K线数据块结构体
 * 
 * \details 存储实时K线数据的数据块：
 *          - 继承RTDayBlockHeader的所有字段
 *          - 包含可变长度的K线数组
 *          - 支持1分钟、5分钟等不同周期的K线数据
 */
typedef struct _RTKlineBlock : _RTDayBlockHeader
{
	WTSBarStruct	_bars[0];	///< K线数据数组（可变长度）
} RTKlineBlock;

/*!
 * \struct RTTickBlock
 * \brief 实时Tick数据块结构体
 * 
 * \details 存储实时Tick行情数据的数据块：
 *          - 继承RTDayBlockHeader的所有字段
 *          - 包含可变长度的Tick数据数组
 *          - 使用新版本的Tick结构体格式
 * 
 * \note By Wesley @ 2021.12.30
 *       实时tick数据块，直接使用新版本的tick结构
 *       切换过程中一定要做好向后兼容性
 */
typedef struct _RTTickBlock : RTDayBlockHeader
{
	WTSTickStruct	_ticks[0];	///< Tick数据数组（可变长度）
} RTTickBlock;

/*!
 * \struct RTTransBlock
 * \brief 实时逐笔成交数据块结构体
 * 
 * \details 存储实时逐笔成交数据的数据块：
 *          - 继承RTDayBlockHeader的所有字段
 *          - 包含可变长度的成交数据数组
 *          - 提供Level2市场深度数据支持
 */
typedef struct _RTTransBlock : RTDayBlockHeader
{
	WTSTransStruct	_trans[0];	///< 逐笔成交数据数组（可变长度）
} RTTransBlock;

/*!
 * \struct RTOrdDtlBlock
 * \brief 实时逐笔委托数据块结构体
 * 
 * \details 存储实时逐笔委托数据的数据块：
 *          - 继承RTDayBlockHeader的所有字段
 *          - 包含可变长度的委托明细数组
 *          - 提供Level2委托明细数据支持
 */
typedef struct _RTOrdDtlBlock : RTDayBlockHeader
{
	WTSOrdDtlStruct	_details[0];	///< 逐笔委托数据数组（可变长度）
} RTOrdDtlBlock;

/*!
 * \struct RTOrdQueBlock
 * \brief 实时委托队列数据块结构体
 * 
 * \details 存储实时委托队列数据的数据块：
 *          - 继承RTDayBlockHeader的所有字段
 *          - 包含可变长度的委托队列数组
 *          - 提供Level2委托队列数据支持
 */
typedef struct _RTOrdQueBlock : RTDayBlockHeader
{
	WTSOrdQueStruct	_queues[0];	///< 委托队列数据数组（可变长度）
} RTOrdQueBlock;

/*!
 * \struct TickCacheItem
 * \brief Tick缓存项结构体
 * 
 * \details 缓存单个Tick数据的结构体：
 *          - 包含交易日期信息
 *          - 包含Tick数据结构体
 *          - 用于实时Tick数据的临时缓存
 */
typedef struct _TickCacheItem
{
	uint32_t		_date;		///< 交易日期
	WTSTickStruct	_tick;		///< Tick数据
} TickCacheItem;

/*!
 * \struct RTTickCache
 * \brief 实时Tick缓存数据块结构体
 * 
 * \details 存储实时Tick缓存数据的数据块：
 *          - 继承RTBlockHeader的所有字段
 *          - 包含可变长度的Tick缓存项数组
 *          - 用于临时存储和快速访问最新的Tick数据
 */
typedef struct _RTTickCache : RTBlockHeader
{
	TickCacheItem	_ticks[0];	///< Tick缓存项数组（可变长度）
} RTTickCache;

/*!
 * \struct HisTickBlock
 * \brief 历史Tick数据块结构体
 * 
 * \details 存储历史Tick数据的数据块：
 *          - 继承BlockHeader的所有字段
 *          - 包含可变长度的历史Tick数组
 *          - 用于长期存储历史行情数据
 */
typedef struct _HisTickBlock : BlockHeader
{
	WTSTickStruct	_ticks[0];	///< 历史Tick数据数组（可变长度）
} HisTickBlock;

/*!
 * \struct HisTickBlockV2
 * \brief 历史Tick数据块V2结构体
 * 
 * \details 存储历史Tick数据的V2版本数据块：
 *          - 继承BlockHeaderV2的所有字段
 *          - 包含可变长度的压缩数据
 *          - 支持数据压缩和更高效的存储
 */
typedef struct _HisTickBlockV2 : BlockHeaderV2
{
	char			_data[0];	///< 压缩后的数据（可变长度）
} HisTickBlockV2;

/*!
 * \struct HisTransBlock
 * \brief 历史逐笔成交数据块结构体
 * 
 * \details 存储历史逐笔成交数据的数据块：
 *          - 继承BlockHeader的所有字段
 *          - 包含可变长度的历史成交数组
 */
typedef struct _HisTransBlock : BlockHeader
{
	WTSTransStruct	_items[0];	///< 历史成交数据数组（可变长度）
} HisTransBlock;

/*!
 * \struct HisTransBlockV2
 * \brief 历史逐笔成交数据块V2结构体
 * 
 * \details 存储历史逐笔成交数据的V2版本数据块：
 *          - 继承BlockHeaderV2的所有字段
 *          - 支持数据压缩存储
 */
typedef struct _HisTransBlockV2 : BlockHeaderV2
{
	char			_data[0];	///< 压缩后的数据（可变长度）
} HisTransBlockV2;

/*!
 * \struct HisOrdDtlBlock
 * \brief 历史逐笔委托数据块结构体
 * 
 * \details 存储历史逐笔委托数据的数据块：
 *          - 继承BlockHeader的所有字段
 *          - 包含可变长度的历史委托明细数组
 */
typedef struct _HisOrdDtlBlock : BlockHeader
{
	WTSOrdDtlStruct	_items[0];	///< 历史委托明细数据数组（可变长度）
} HisOrdDtlBlock;

/*!
 * \struct HisOrdDtlBlockV2
 * \brief 历史逐笔委托数据块V2结构体
 * 
 * \details 存储历史逐笔委托数据的V2版本数据块：
 *          - 继承BlockHeaderV2的所有字段
 *          - 支持数据压缩存储
 */
typedef struct _HisOrdDtlBlockV2 : BlockHeaderV2
{
	char			_data[0];	///< 压缩后的数据（可变长度）
} HisOrdDtlBlockV2;

/*!
 * \struct HisOrdQueBlock
 * \brief 历史委托队列数据块结构体
 * 
 * \details 存储历史委托队列数据的数据块：
 *          - 继承BlockHeader的所有字段
 *          - 包含可变长度的历史委托队列数组
 */
typedef struct _HisOrdQueBlock : BlockHeader
{
	WTSOrdQueStruct	_items[0];	///< 历史委托队列数据数组（可变长度）
} HisOrdQueBlock;

/*!
 * \struct HisOrdQueBlockV2
 * \brief 历史委托队列数据块V2结构体
 * 
 * \details 存储历史委托队列数据的V2版本数据块：
 *          - 继承BlockHeaderV2的所有字段
 *          - 支持数据压缩存储
 */
typedef struct _HisOrdQueBlockV2 : BlockHeaderV2
{
	char			_data[0];	///< 压缩后的数据（可变长度）
} HisOrdQueBlockV2;

/*!
 * \struct HisKlineBlock
 * \brief 历史K线数据块结构体
 * 
 * \details 存储历史K线数据的数据块：
 *          - 继承BlockHeader的所有字段
 *          - 包含可变长度的历史K线数组
 *          - 支持各种周期的K线数据存储
 */
typedef struct _HisKlineBlock : BlockHeader
{
	WTSBarStruct	_bars[0];	///< 历史K线数据数组（可变长度）
} HisKlineBlock;

/*!
 * \struct HisKlineBlockV2
 * \brief 历史K线数据块V2结构体
 * 
 * \details 存储历史K线数据的V2版本数据块：
 *          - 继承BlockHeaderV2的所有字段
 *          - 支持数据压缩存储
 *          - 提供更高效的K线数据存储方案
 */
typedef struct _HisKlineBlockV2 : BlockHeaderV2
{
	char			_data[0];	///< 压缩后的K线数据（可变长度）
} HisKlineBlockV2;

/*!
 * \struct HisKlineBlockOld
 * \brief 历史K线数据块旧版本结构体
 * 
 * \details 存储历史K线数据的旧版本数据块：
 *          - 继承BlockHeader的所有字段
 *          - 使用旧版本的K线数据结构
 *          - 提供向后兼容性支持
 */
typedef struct _HisKlineBlockOld : BlockHeader
{
	WTSBarStructOld	_bars[0];	///< 旧版本历史K线数据数组（可变长度）
} HisKlineBlockOld;

#pragma pack(pop)
